package ar.edu.utn.frba.tacs.warnes;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;

import ar.edu.utn.frba.tacs.warnes.dao.AutoDao;
import ar.edu.utn.frba.tacs.warnes.dao.BaseDaoImpl;
import ar.edu.utn.frba.tacs.warnes.pieza.Pieza;

@Entity
public class Auto extends BaseEntityImpl {
	
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO, generator = "AutoSeq")
	@SequenceGenerator(name = "AutoSeq", sequenceName = "AutoSeq")
	public long id;

	@OneToMany(mappedBy ="autoOrigen", fetch = FetchType.LAZY)
	@Cascade(value={CascadeType.PERSIST})	
	private List<Pieza> piezasDelAuto = new ArrayList<Pieza>();
	
	private String patente;
	private Integer modelo;
	private Date anio;
	private Date fechaDesguace;
	
	public long getId() {
		return this.id;
	}
	public void setId(long id) {
		this.id = id;
	}
	public List<Pieza> getPiezasDelAuto() {
		return this.piezasDelAuto;
	}
	public void setPiezasDelAuto(List<Pieza> piezasDelAuto) {
		this.piezasDelAuto = piezasDelAuto;
	}
	public Auto(String patente) {
		this.setPatente(patente);
	}
	public String getPatente() {
		return this.patente;
	}
	public void setPatente(String patente) {
		this.patente = patente;
	}
	public Integer getModelo() {
		return this.modelo;
	}
	public void setModelo(Integer anio) {
		this.modelo = anio;
	}
	public Date getAnio() {
		return this.anio;
	}
	public void setAnio(Date anio) {
		this.anio = anio;
	}
	public Date getFechaDesguace() {
		return this.fechaDesguace;
	}
	public void setFechaDesguace(Date fechaDesguace) {
		this.fechaDesguace = fechaDesguace;
	}
	
	public void borrarPieza(Pieza pieza){
		this.getPiezasDelAuto().remove(pieza);
	}
	
	public void agregarPieza(Pieza pieza){
		this.getPiezasDelAuto().add(pieza);
	}
	
	public Float getPorcentajePiezasVendidas(){
		int cantVendidas = 0;
		for (Pieza pieza : this.getPiezasDelAuto()) {
			if(pieza.estaVendida()){
				cantVendidas++;
			}
		}
		return this.getPiezasDelAuto().isEmpty() ? new Float(0) :
			cantVendidas / this.getPiezasDelAuto().size();
		
	}
	
	@Override
	public void delete() {
		BaseDaoImpl<Auto> dao = AutoDao.getInstance();
		dao.delete(this);
	}
	
	@Override
	public void save() {
		BaseDaoImpl<Auto> dao = AutoDao.getInstance();
		dao.save(this);
	}
	
}
